/* 08 Remote Control

 If you connect a IR receiver to the robot,
 you can control it like a RC car.
 Using the remote control comes with sensor
 pack, You can make the robot move around
 without even touching it!

 Circuit:
 * Arduino Robot
 * Connect the IRreceiver to D2
 * Remote control from Robot sensor pack

 based on the IRremote library
 by Ken Shirriff
 http://arcfn.com

 created 1 May 2013
 by X. Yang
 modified 12 May 2013
 by D. Cuartielles

 This example is in the public domain
 */

// include the necessary libraries
#include <IRremote.h>
#include <IRremoteTools.h>
#include <ArduinoRobot.h>
#include <Wire.h>
#include <SPI.h>

// Define a few commands from your remote control
#define IR_CODE_FORWARD 284154405
#define IR_CODE_BACKWARDS 284113605
#define IR_CODE_TURN_LEFT 284129925
#define IR_CODE_TURN_RIGHT 284127885
#define IR_CODE_CONTINUE -1

boolean isActing = false; //If the robot is executing command from remote
long timer;
const long TIME_OUT = 150;

void setup() {
  // initialize the Robot, SD card, display, and speaker
  Serial.begin(9600);
  Robot.begin();
  Robot.beginTFT();
  Robot.beginSD();

  // print some text to the screen
  beginIRremote(); // Start the receiver
}

void loop() {
  // if there is an IR command, process it
  if (IRrecived()) {
    processResult();
    resumeIRremote(); // resume receiver
  }

  //If the robot does not receive any command, stop it
  if (isActing && (millis() - timer >= TIME_OUT)) {
    Robot.motorsStop();
    isActing = false;
  }
}
void processResult() {
  unsigned long res = getIRresult();
  switch (res) {
    case IR_CODE_FORWARD:
      changeAction(1, 1); //Move the robot forward
      break;
    case IR_CODE_BACKWARDS:
      changeAction(-1, -1); //Move the robot backwards
      break;
    case IR_CODE_TURN_LEFT:
      changeAction(-0.5, 0.5); //Turn the robot left
      break;
    case IR_CODE_TURN_RIGHT:
      changeAction(0.5, -0.5); //Turn the robot Right
      break;
    case IR_CODE_CONTINUE:
      timer = millis(); //Continue the last action, reset timer
      break;
  }
}
void changeAction(float directionLeft, float directionRight) {
  Robot.motorsWrite(255 * directionLeft, 255 * directionRight);
  timer = millis();
  isActing = true;
}

